965
社区成员
发帖
与我相关
我的任务
分享
这是我参加朝闻道知识分享大赛的第30篇文章.
这段时间都没怎么写过代码,也没补过题,,
其实赛时想到了想法,写了一遍没过就换下一题了,但是下一题也wa了()
可以发现左端点左边的0对排序无影响,因为排序后0恒在左端;同理,右端点右边的1对排序无影响。
所以预处理序列,找到0的右端第一个不为0的位置,1的左端第一个不为1的位置,将区间缩短。注意处理边界。
,,调了无数遍才调出来,,有毒
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define _cf() int _;cin>>_;while(_--)
inline ll read(){char c=getchar();ll x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;}
const int N = 2e6;
const int inf = 2147483647;
//乘法一定要注意会不会爆!!!
void Solve()
{
int n,m;
cin>>n>>m;
vector<char> a(n+1);
vector<int> pre(n+1),suf(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
pre[1]=0,suf[n]=n+1;
for(int i=2;i<=n;i++)
{
if(a[i]=='0') pre[i]=i;
else
{
if(a[i-1]=='0') pre[i]=i-1;
else pre[i]=pre[i-1];
}
}
for(int i=n-1;i>0;i--)
{
if(a[i]=='1') suf[i]=i;
else
{
if(a[i+1]=='1') suf[i]=i+1;
else suf[i]=suf[i+1];
}
}
set<PII> s;
int x,y;
while(m--)
{
cin>>x>>y;
if(suf[x]>pre[y]) s.insert({-1,-1});
else s.insert({suf[x],pre[y]});
}
cout<<s.size()<<endl;
}
int main()
{
IOS;
_cf()
Solve();
}
又是一题模拟,就是没想清楚,,,服了,补题就一发过
记录每个不含0的区间,如果区间里有2就两边都可以染色,全1的区间就选一个端点染色,先处理含2的区间。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define _cf() int _;cin>>_;while(_--)
inline ll read(){char c=getchar();ll x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;}
const int N = 2e6;
const int inf = 2147483647;
//乘法一定要注意会不会爆!!!
void Solve()
{
int n;
cin>>n;
vector<int> a(n+2);
vector<PII> a1,a2;
for(int i=1;i<=n;i++) cin>>a[i];
int l=-1,op=0;
for(int i=1;i<=n;i++)
{
if(a[i]>0)
{
if(a[i]==2) op=1;
if(a[i-1]==0)l=i;
if(a[i+1]==0)
{
if(op==1)
{
a2.push_back({l,i});
op=0;
}
else a1.push_back({l,i});
}
}
}
for(auto t:a2)
{
int l=t.first,r=t.second;
a[l-1]=-1;a[r+1]=-1;
}
for(auto t:a1)
{
int l=t.first,r=t.second;
if(a[l-1]==0&&l-1>0) a[l-1]=-1;
else a[r+1]=-1;
}
int cnt=a1.size()+a2.size();
for(int i=1;i<=n;i++) if(a[i]==0) cnt++;
cout<<cnt<<endl;
}
int main()
{
IOS;
//_cf()
Solve();
}
E题有时间再补吧(好像一次没补完的都没去补了())