2012 ACM ICPC 長春賽區網路賽

2021-06-09 15:03:29 字數 3833 閱讀 6653

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, 然後就是更新,如果存在要更新的區間那麼直接更新就行,否則左孩子依舊更新,右孩子找到第乙個屬於a~b區間並且滿足(i - a)%k==0 的點,繼續更新,詢問的時候要把 所有cnt[i][k] = c的影響算進去

#include#include#includeusing namespace std;

#define lson l , m , rt<<1

#define rson m + 1 , r , rt<<1|1

const int maxn = 50005;

typedef long long ll;

ll cnt[50005*3][11]; //cnt[i][k]=c當前區間i每隔k個字元累加c

ll a[maxn];

void build(int l , int r , int rt)

void update(int l , int r , int rt , int l , int r , int k , ll c)

int m;

m = (l + r) >> 1;

if(m >= r) else if(m < l) else

}ll query(int l , int r , int rt , int pos)

if(l == r) return ans;

int m = (l + r) >> 1;

if(pos <= m) return query(lson , pos) + ans;

else return query(rson , pos) + ans;

}int main() else

}}

}

1002 alice and bob

題意:看到題目不要以為是博弈、、、 呵呵 , 是貪心、、、就是alice有一些矩形,已知他們的長寬,bob同樣也有,求alice最大可能覆蓋bob的矩形的個數(長寬都分別比塔大)

思路:具體參考 資訊平台站的題解   就是先把兩個人的矩形按照h 、 w 進行排序,然後根據alice的h去找滿足能覆蓋bob的h然後在這些bob的矩形中,找出bob矩形的w剛好小於等於alice的w的矩形,這是比較理想的一次覆蓋,因為要留下較小的給其他矩形覆蓋留更多的選擇餘地。這裡用muliset來搞。

#include#include#include#include#define ft first

#define sd second

using namespace std;

const int maxn = 100010;

typedef pairpii;

pii a[maxn] , b[maxn];

int main()

if(mt.size()>=1) }}

printf("%d\n",ans);

}}

還有乙個版本 是把兩人的矩形放在一起h w id進行排序,其中排序的時候過載的小於號的方法注意學習,然後h肯定是公升序的,然後bob的w插入到multiset,接著如果遇到alice的矩形,那麼h肯定能覆蓋multiset中的bob的h(沒有插入h,因為h是公升序排的),剩下的就是要根據此時alice的w去找multiset中剛好比它小一點或者等於它的進行覆蓋。

#include#include#include#includeusing namespace std;

const int maxn = 100010;

struct rec

};multisetmt;

multiset::iterator it;

rec a[maxn<<1];

int main()

sort(a , a +(n<<1));

mt.clear();

int ans = 0;

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

}

}

}printf("%d\n",ans);

}}

1006 lianliankan

題意:題意有歧義,題解是狀壓、、不會、、貌似模擬可以搞、、、 就是每次消除棧頂元素和向下數6個長度的距離中和其相同的元素,如果最後能消除所有的棧中元素那麼輸出1,否則輸出0

思路:模擬即可

#include#include#include#includeusing namespace std;

int main()

if(n%2==1)

bool flag;

memset(vis , 0 , sizeof(vis));

int cnt = 0;

int ff = top - 1;

while(cnt != n)

}if(flag) else

} } }

loop:

if(!flag) printf("0\n");

else printf("1\n");

}

}

1011 usaco orz

題意:給出一些木棍的長度最多有15根,然後所有的木棒都要用上,求能組成三角形的種類

思路:參考 就是把15根木棍放到三條邊的位置上,最大複雜度是3^15,每次搜的時候把三條邊排序分別放在d[0] , d[1] , d[2]中,然後用pair 兩條小邊和map進行判重,這樣搜貌似正好是可以超時,根據對稱性直接把a[1]放在第一條邊的位置,那麼複雜度減小為3^14可以卡過去、、、

#include#include#include#includeusing namespace std;

int a[20] , d[5] , ans , sum , n;

set> myset;

void dfs(int i , int suma , int sumb , int sumc) else

if(sumc < d[0]) d[0] = sumc;

if(sumc > d[1]) d[1] = sumc;

d[2] = sum - d[0] - d[1];

swap(d[2] , d[1]);

if(d[0] + d[1] <= d[2]) return;

printf("%d %d %d\n",d[0],d[1],d[2]);

if(myset.find(make_pair(d[0] , d[1]))!=myset.end()) return;

ans++;

myset.insert(make_pair(d[0] , d[1]));

return;

}

dfs(i + 1 , suma + a[i] , sumb , sumc);

dfs(i + 1 , suma , sumb + a[i] , sumc);

dfs(i + 1 , suma , sumb , sumc + a[i]);

}int main()

myset.clear();

ans = 0;

dfs(2 , a[1] , 0 , 0);

printf("%d\n",ans);

}

}

ACM2012長春賽區網路賽 1002

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

2017ACM ICPC北京賽區

有n只貓,和m條魚,第i只貓吃掉一條魚所花的時間為c i 乙隻貓,吃完乙個會繼續吃 如果還有的話 問在x時刻後有多少條魚留下 分別輸出完整的和不完整的 分析 暴力for一遍,trick 給每只貓設定乙個標記表示i秒的時候,它吃的魚還剩多少,這樣方便統計,便於模擬啊 include define ll...

CCPC長春賽區流水賬

day 1 坐了27個小時火車 整個人下車都快崩潰了。出站就感覺到了北方的 涼爽 計程車半個小時就到了賓館,這個賓館的設計簡直是醉了,浴室沒有門是個啥玩意?晚上去了仁風閣,朝鮮妹子真是太溫柔了 早上去報道,領了150塊,內心十分激動。走進日新樓,我有點懵逼。這個真的是食堂?電影院 游泳館 電競中心 ...