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的...