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塊,內心十分激動。走進日新樓,我有點懵逼。這個真的是食堂?電影院 游泳館 電競中心 ...