제출 #930609

#제출 시각아이디문제언어결과실행 시간메모리
930609Faisal_SaqibJoker (BOI20_joker)C++17
39 / 100
2067 ms22520 KiB
#include <bits/stdc++.h>
using namespace std;
const int M=2e5+1;
int n,m,q;
bool mark[M],vis[M];
int val[M];
vector<pair<int,int>> ma[M],query;
int mx_r_for_l[M];
bool found=0;
void dfs(int x)
{
    vis[x]=1;
    for(auto [y,ind]:ma[x])
    {
        if(mark[ind])
            continue;
        if(!vis[y])
        {
            val[y]=(val[x]+1)%2;
            dfs(y);
        }
        else if((val[y]+1)%2!=val[x])
        {
            found=1;
        }
    }
}
bool check(int l,int r)
{
    // cout<<"Check "<<l<<' '<<r<<endl;
    for(int i=1;i<=n;i++)
        vis[i]=0;
    for(int i=0;i<m;i++)
        mark[i]=(l<=i and i<=r);
    found=0;
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            dfs(i);
        }
    }
    // cout<<"Answer "<<found<<endl;
    return found;
}
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
 
    cin>>n>>m>>q;
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        // cout<<i+1<<"th edge is "<<a<<' '<<b<<endl;
        ma[a].push_back({b,i});
        ma[b].push_back({a,i});
    }
    vector<int> difl={-1};
    for(int lp=0;lp<q;lp++)
    {
        int l,r;
        cin>>l>>r;
        l--;
        r--;
        query.push_back({l,r});
        difl.push_back(l);
    }
    sort(begin(difl),end(difl));
	  int p=-1;
    for(int i=1;i<difl.size();i++)
    {
        if(difl[i-1]!=difl[i])
        {
            int l=difl[i];
            int sr=max(p,l-1);
            int er=m;
            // cout<<"Solve "<<l<<endl;
            while(sr+1<er)
            {
                int mid=(sr+er)/2;
                if(check(l,mid))
                {
                    //is there is odd cycle then we have to remove more edge 
                    sr=mid;
                }
                else{
                    er=mid;
                }
            }
            // cout<<"mx r"<<sr<<endl;
            mx_r_for_l[l]=sr;
	          p=max(p,sr);
        }
    }
    for(auto [l,r]:query)
    {
        if(mx_r_for_l[l]>=r)
        {
            cout<<"YES"<<'\n';
        }
        else{
            cout<<"NO"<<'\n';
        }
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Joker.cpp: In function 'int main()':
Joker.cpp:73:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |     for(int i=1;i<difl.size();i++)
      |                 ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...