1. 程式人生 > 實用技巧 >QFNU-ACM 2020.9.27組隊賽 2019山東省賽復現 補題

QFNU-ACM 2020.9.27組隊賽 2019山東省賽復現 補題

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; } }