2012長春網路賽

2021-06-09 05:46:40 字數 2975 閱讀 5394

acmicpc 解題報告彙總: 1:

線段樹(i-a)%k = 0 即i%k=a%k

節點維護乙個二維陣列add, add[a][b]=c,表示該區間下標i%a=b的加c

那麼,  update(l, r, k, l%k, v)這樣就可以分到子區間了

但是, 這樣會爆記憶體,因為a%b

#pragma warning (disable: 4786)

#include "stdio.h"

#include "string.h"

#include "iostream"

#include "algorithm"

#include "vector"

#include "map"

#include "set"

using namespace std;

const int n = 50005;

int seg[n*3][55], da[n];

void update(int l, int r, int a, int b, int c, int rt, int l, int r)

seg[rt][ii] += c;

return;

} int mid = (l+r)>>1;

if(l <= mid)

if(r > mid)

}int query(int x, int rt, int l, int r)

res += seg[rt][ii];

} if(x <= l && r <= x)

if(x <= mid)

if(x > mid)

return res;

}int main()

memset(seg, 0, sizeof(seg));

scanf("%d", &q);

int t, l, r, k, v;

while(q--)

else if(t==2)

} }return 0;

}

2:先按第一維排序,然後第二維

然後對a的每個i,找出小於a[i].h的b.h,將對應的w塞到集合裡

剛才已經保證了第一維滿足了

然後貪心的從集合裡面找a[i]能覆蓋的最大的w

#pragma warning (disable: 4786)

#include "stdio.h"

#include "string.h"

#include "iostream"

#include "algorithm"

#include "vector"

#include "map"

#include "set"

using namespace std;

typedef pairpii;

vectora, b;

multisetc;

multiset::iterator it;

int main()

for(i = 0; i < n; ++i)

sort(a.begin(), a.end());

sort(b.begin(), b.end());

int ans = 0;

c.clear();

for(i=j=0; i

8:dfs求出每個點的取值範圍, 如果出現up

#pragma warning (disable: 4786)

#include "cstdio"

#include "cstring"

#include "cassert"

#include "iostream"

#include "algorithm"

#include "vector"

#include "map"

#include "set"

using namespace std;

typedef __int64 ll;

typedef pairpii;

typedef vectorvi;

#define max(a, b) a>b?a:b

#define min(a, b) a')

else

calc(a, dw, up);

} dfs(1);

puts(ok?"true":"lie");

} return 0;

}

11:暴力, 3^15,

敲**的時候兩個set輪換...

卡過去了...

#pragma warning (disable: 4786)

#include "stdio.h"

#include "string.h"

#include "iostream"

#include "algorithm"

#include "vector"

#include "map"

#include "set"

using namespace std;

struct node

node(int aa, int bb, int cc):a(aa), b(bb), c(cc){}

bool operator < (const node & tmp) const

if(aa>cc)

if(bb>cc)

return node(aa, bb, cc);

}};int isok(const node& n)

vectorv;

sets[2];

int main()

{ int t, n, x, i;

scanf("%d", &t);

while(t--) {

scanf("%d", &n);

v.clear();

for(i=0; i::iterator it;

for(i=0; i

2012長春網路賽1011

hdu 4277 dfs hash三角形三邊判重 每一條邊可以由多條線段組成,判斷倆個三角形不同是至少有一條邊不等 include include include includeusing namespace std const int mm 55 const int mod 1000007 int...

2012 ACM ICPC 長春賽區網路賽

1001 a problem with integers 題意 有兩種操作,一種是更新區間a b中a i b and i a k 0 的點加上c 一種是詢問aa 的value 思路 明顯的線段樹 但是依然跪倒啊 cnt i k c 代表當前區間i 每隔k個字元累加c,然後就是更新,如果存在要更新的區...

ACM2012長春賽區網路賽 1002

題目是說a有n張卡片,b有n張卡片,當且僅當a的某張卡片長和寬均不小於b某張卡片的長和寬時可以將其覆蓋,覆蓋與被覆蓋都只能是一次,問最多能有多少次覆蓋 長寬不能互換 將這些卡片以長為第一關鍵字公升序排列,再以寬作為第二關鍵字公升序排列,都相同則將b的放在前面,a的放在後面,然後從頭到尾掃瞄,對於a的...