大意:
給你 3 個長度為 n 的排列 , , , 求
∑[a x < a y ][b x < b y ][c x < c y ], n ≤ 10 5
1≤x,y≤n
題解:
直接容斥,設sx,y表示滿足上述式子的數量 答案即為sx,y==3
容易發現sx,y只能取2,3
設pa,b 為a,b兩個陣列滿足[ax
然後顯然pa,b+pb,c+pa,c=3*sx,y==3 + sx,y==2
2sx,y=pab+pbc+pac-n*(n-1)>>1
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7using
namespace
std;
8 typedef long
long
ll;9
const
int n=2e6;
10int
n;11
inta[n],b[n],c[n];
12long
long
seed;
13long
long
rand()
16void gen(int *a)
20struct
node
23}tmp[n];
24int tree[n*4
];25
void add(int
sta)
28int getsum(int
sta)
33 ll solve(int *a,int *b);
36 sort(tmp+1,tmp+n+1
);37
for(int i=1;i<=n;i++)
41 memset(tree,0,sizeof
(tree));
42return
ans;43}
44int
main()
45
另外就是60的cdq 很好想:
以a先排個序,然後就是b,c的二維選點,cdq nlog2n玩過
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7using
namespace
std;
8 typedef long
long
ll;9
const
int n=500005
;10 ll seed,ans=0;int
a[n],b[n],c[n],n;
11ll rand()
14void gen(int *a)
18struct
nodeq[n];
21bool comp(const node &p,const node &pp)
22int tree[n<<1
];23
void add(int sta,int
ad)26
int getsum(int
sta)
31bool
check(node px,node qx)
35node tmp[n];
36void cdq(int l,int
r)46
else50}
51while(xl<=mid)
55while(xr<=r)
59for(int i=1;i<=m;i++)63}
64void
luang()
6569 sort(q+1,q+n+1
,comp);
70 cdq(1
,n);
71 printf("
%lld\n
",ans);72}
73void
work()
7481
82int
main()
83
大佬的難題
給n個三維座標點,滿足每維座標都是1 n的排列,求三維偏序。注意到任意兩個位置,都有乙個位置有至少兩維比另乙個位置的對應兩維大,於是可以容斥,那麼只需要做二維偏序。include include define fo i,a,b for i a i b i using namespace std ty...
CDUTCM 1216任大佬的數學難題
ps 這道題卡了很久,到最後都沒有ac,題意很清楚明了,認真分析一下就可以發現就是乙個公式c k,m a的 k m 次方乘以b的m次方,但由於k,n,m都很大,所以求c k,m 時不能用常規的取模運算,具體為什麼點這裡,大佬講的很詳細,除法不能取模,所以就要用乘法逆元,具體我也不是很懂,記住要這樣用...
清華集訓2017模擬12 10 大佬的難題
1 n 2e6,時限 2.5s 容斥原理瞎搞。設a,b,c分別為滿足三個條件的集合。根據容斥原理,有 a b c a b c a b a c b c a b c 而a b c同時會等同於總數n n 1 都大於的個數 即都小於的個數a b c 所以 n n 1 a b c a b c a b a c ...