T1 前缀数组
大水题能说啥。。。。。
第三个大样例用freopen和直接打开不一样?
emmmmm。。。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD=1e9+7;
LL ans;
int Read(){
int i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
int main(){
int num=Read();
string s;
cin>>s;
int len=s.size();
for(LL i=1;i<=len;++i){
ans=(ans+i*i%MOD)%MOD;
}
cout<<ans;
}
T2 失意
xjb写了个二分74分,本来以为还阔以结果90多起串串。。。。。wtcl
排序后可以发现左端点递增,所以只要保证右端点扩展即可,用堆维护一下就好了
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num;
int n,m;
int ansl,ansr,ans;
struct node{
int l,r;
int id;
friend inline bool operator<(const node &a,const node &b){
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
}a[MAXN];
priority_queue<int,vector<int>,greater<int> > q;
int Read(){
int i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
int main(){
num=Read();
n=Read(),m=Read();
for(int i=1;i<=n;++i) a[i].l=Read(),a[i].r=Read(),a[i].id=i;
sort(a+1,a+n+1);
for(int i=1;i<=n;++i){
q.push(a[i].r);
if(q.size()>m) q.pop();
if(q.size()==m&&q.top()-a[i].l>ans){
ans=q.top()-a[i].l;
ansl=a[i].l,ansr=q.top();
}
}
cout<<ans<<'\n';
int cnt=0;
if(ans==0){
for(int i=1;i<=m;++i)
cout<<i<<' ';
return 0;
}
for(int i=1;i<=n;++i){
if(a[i].l<=ansl&&a[i].r>=ansr) cout<<a[i].id<<' ',++cnt;
if(cnt==m) break;
}
return 0;
}
T3 孤独
xjb想了个错误算法鬼知道他就艹过了第二个样例。。。。
正解容斥,对每个状态记录贡献为正或负,将每个出现状态下传到子集,最后扫一遍统计即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1<<21;
const LL MAXM=1e5+10;
const LL MOD=1e9+7;
LL num;
LL n,m,k,ans;
LL a[MAXN];
LL flag[MAXN],cnt[MAXN];
LL Read(){
LL i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
LL ksm(LL a,LL b){
LL ret=1;
while(b){
if(b&1) ret=ret*a%MOD;
b>>=1;
a=a*a%MOD;
}
return ret;
}
int main(){
num=Read();
n=Read(),m=Read(),k=Read();
LL state=1<<n;
for(LL i=1;i<=m;++i){
a[i]=Read();
cnt[a[i]]++;
}
flag[0]=-1;
for(LL i=0;i<state;++i){
for(LL j=1;j<=n;++j){
if(!(i&(1<<(j-1)))){
flag[i+(1<<(j-1))]=flag[i]*(-1);
}
}
}
for(LL i=1;i<=n;++i){
for(LL j=state-1;~j;--j){
if(j&(1<<(i-1))){
cnt[j-(1<<(i-1))]+=cnt[j];
}
}
}
for(LL i=1;i<state;++i){
ans=((ans+flag[i]*ksm(cnt[i],k))%MOD+MOD)%MOD;
}
cout<<ans;
}