NOIP模拟六
又是大寄的一天,真就只有提高二等水平。
T1
分类讨论,过了
code
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=114514,M=1919810;
ll T;
char s[N],t[N];
ll val[N];
int main(){
//freopen("T1.in","r",stdin);
//freopen("T1.out","w",stdout);
cin>>T;
while(T--){
cin>>(s+1);
ll n=strlen(s+1),len=strlen(s+1);
ll ans=4;
for(int i=1;i<=n;++i){
if(s[i]=='n'||s[i]=='o'||s[i]=='i'||s[i]=='p') ans=min(ans,3ll);
if((s[i]=='n'&&s[i+1]=='o')||(s[i]=='n'&&s[i+1]=='i')||(s[i]=='n'&&s[i+1]=='p')
||(s[i]=='o'&&s[i+1]=='i')||(s[i]=='o'&&s[i+1]=='p')||(s[i]=='i'&&s[i+1]=='p')) ans=min(ans,2ll);
if((s[i]=='n'&&s[i+1]=='o'&&s[i+2]=='i')||(s[i]=='n'&&s[i+1]=='o'&&s[i+2]=='p')
||(s[i]=='n'&&s[i+1]=='i'&&s[i+2]=='p')||(s[i]=='o'&&s[i+1]=='i'&&s[i+2]=='p')) ans=min(ans,1ll);
if(s[i]=='n'&&s[i+1]=='o'&&s[i+2]=='i'&&s[i+3]=='p') ans=min(ans,0ll);
if(s[i]=='o'&&s[i+1]=='n'&&s[i+2]=='i'&&s[i+3]=='p') ans=min(ans,1ll);
if(s[i]=='n'&&s[i+1]=='i'&&s[i+2]=='o'&&s[i+3]=='p') ans=min(ans,1ll);
if(s[i]=='n'&&s[i+1]=='o'&&s[i+2]=='p'&&s[i+3]=='i') ans=min(ans,1ll);
if(s[i]=='o'&&s[i+1]=='n'&&s[i+2]=='p'&&s[i+3]=='i') ans=min(ans,2ll);
if(s[i-1]=='n'&&s[i+2]=='p') ans=min(ans,2ll);
if(s[i-1]=='n'&&s[i+1]=='o') ans=min(ans,3ll);
if(s[i-1]=='o'&&s[i+1]=='i') ans=min(ans,3ll);
if(s[i-1]=='i'&&s[i+1]=='p') ans=min(ans,3ll);
if(s[i-1]=='n'&&s[i+1]=='i') ans=min(ans,2ll);
if(s[i-1]=='o'&&s[i+1]=='p') ans=min(ans,2ll);
if(s[i-1]=='n'&&s[i+1]=='p') ans=min(ans,2ll);
if(s[i-2]=='n'&&s[i-1]=='o'&&s[i+1]=='i'&&s[i+2]=='p') ans=min(ans,1ll);
if(s[i-2]=='n'&&s[i-1]=='o'&&s[i+2]=='i'&&s[i+3]=='p') ans=min(ans,2ll);
if(s[i-1]=='n'&&s[i+1]=='i'&&s[i+2]=='p') ans=min(ans,1ll);
if(s[i-2]=='n'&&s[i-1]=='o'&&s[i+1]=='p') ans=min(ans,1ll);
}
cout<<ans<<'\n';
}
return 0;
}
T2
想到用数据结构,但是不知道维护啥……
思路:先找到每一行每一列的编号最小的障碍物,各自对应列、行的编号,然后先把能加上的格子都给加上,但是这样会有重复的,要考虑怎么去重(我就是这一步不会了)。
解法:用一个数据结构快速维护前缀和与查询,但是原理是什么啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
妈的不搞了之后问同学……
T3&T4
T3分组dp容斥系数预处理,T4不知道,都不会。
頑張って