QFNU-ACM 2020.9.27組隊賽 2019山東省賽復現 補題
阿新 • • 發佈:2020-10-04
4116 Game on a Graph
給出n個點,m條邊,m條邊一定連通,兩組人依照一定次序取走一些邊,取走之後,圖形不連通的就輸了
即取走n-1條邊的隊伍輸掉
英語看不懂啊啊啊QWQ
#include <bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--){ int n,a,i,x,y; string s; cin>>n>>s; cin>>x>>y; for(i=0;i<y;i++){ cin>>a>>a; } y=(y-x+1)%n; if(s[y]=='1'){ cout<<2<<endl; }else{ cout<<1<<endl; } } }
4120 Tokens on the Segments
給出N條線段,(l,r),每個整數點都可以被標記,但被標記的座標不能相同,求至少有一個點被標記的點有多少
先對所有線段按左端點從小到大,左端點相同時按右端點從小到大的順序進行排序
隊首線段左端點可標記則出隊,ans++,
若隊首線段左端點已被標記,則將該線段左端點加一後再入隊(之後再看看能不能標記W)
我的腦子裡沒有佇列
參考大佬程式碼
#include <bits/stdc++.h> using namespace std; class segment{ public: int l,r; bool operator<(segment a)const{ if(l==a.l){ return r>a.r; } return l>a.l; } }; priority_queue<segment> q; int main() { int t,n,i; cin>>t; segment m; while(t--) { cin>>n; for(i=0; i<n; i++) { cin>>m.l>>m.r; q.push(m); } long long h=0,ans=0; while(!q.empty()) { segment a=q.top(); q.pop(); if(a.l==h) { a.l++; if(a.l<=a.r) q.push(a); } else { h=a.l; ans++; } } cout<<ans<<endl; } }