\(NOIP\) 测试

考的一般般。

\(T1\) WOJ4656

签到题,其实就是算 \(\sum\limits_{i=1}^n i^2\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int n,ans=0,len;
string s;
signed main(){
cin>>n>>s;
len=s.length();
for(int i=1;i<=len;i++)
ans=(ans+i*i%mod)%mod;
cout<<ans;
return 0;
}

当然可以用小学奥数 \(O(1)\) 算


\(T2\) WOJ4657(堆,区间交)

给出 \(n\) 个区间,选出 \(m\) 个区间使得这 \(m\) 个区间的交最大。

打出暴力后又打了一个正确性不保证的 dp,排序后成功过了大样例

区间交的左右端点都是给出区间的左右端点,所以考虑把所有区间按左端点排序后从左往右枚举,同时在堆里加入他们的右端点,对于一个左端点,从右往左数第 \(m\) 个右端点就是它对应交区间的右端点,所以小根堆维护一个从右往左的 \(m\) 个右端点。另外,如果一个区间的右端点小于当前堆顶,那么该区间的答案一定比上个答案劣(因为左端点单调上升),可以直接跳过,对于第二行输出,在维护答案时维护答案对应左右端点,枚举所有区间,完全覆盖答案区间的就输出,一共输出 \(m\) 个,另外答案为 \(0\) 时特判一下随便输出 \(m\) 个就行了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=1e6+5;
const int M=5e4+5;
int num,n,m;
struct seq{
int l,r,o;
}a[N];
bool cmp(seq x,seq y){
if(x.l!=y.l)return x.l<y.l;
return x.r<y.r;
}
struct node{
int x,i;
};
bool operator<(const node &x,const node &y){
return x.x>y.x;
}
priority_queue<node>q;
signed main(){
num=in,n=in,m=in;
for(int i=1;i<=n;i++)
a[i].l=in,a[i].r=in,a[i].o=i;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=m;i++)
q.push({a[i].r,i});
int ans=max(0ll,q.top().x-a[m].l),ansl=a[m].l,ansr=q.top().x;
for(int i=m+1;i<=n;i++){
if(a[i].r<q.top().x)continue;
q.push({a[i].r,i});
q.pop();
if(ans>max(0ll,q.top().x-a[i].l))continue;
ans=max(0ll,q.top().x-a[i].l);
ansl=a[i].l,ansr=q.top().x;
}
cout<<ans<<'\n';
if(ans==0){
for(int i=1;i<=m;i++)
cout<<i<<" ";
return 0;
}
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i].l<=ansl&&a[i].r>=ansr){
cout<<a[i].o<<" ";
cnt++;
}
if(cnt==m)break;
}
return 0;
}

\(T3\) WOJ4658(容斥)

时间奉献给T2了,打了指数暴力就走了

容斥公式:

\(|A_1\cup A_2 \cup\cdots\cup A_m|=\sum\limits_{1\leq i\leq m}|A_i|-\sum\limits_{1\leq i\leq j\leq m}|A_i\cap A_j|+\sum\limits_{1\leq i\leq j\leq k\leq m}|A_i\cap A_j\cap A_k|-\cdots+(-1)^{m-1}*|A_1\cap A_2 \cap\cdots\cap A_m|\)

在此题中也就是说所有1个话题相同的方案数减去两个话题相同的方案数加上3个话题相同的方案数减去……一直到n个话题。

我们只需要统计 \(2^N\) 个状态分别有多少人的集合或他们的子集,然后算出当前状态 \(1\) 的个数,奇数就加,偶数就减。在统计人数时需要枚举一个二进制数集合的所有子集,这篇blog里有详细的证明。

然后卡卡常(或者不用)就做完了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M=1e5+5;
const int mod=1e9+7;
const int N=1<<20+5;
int num,n,m,k;
int a[M];
int cnt[N];
inline int lowbit(int x){return x&(-x);}
inline int pc(int x){
int res=0;
while(x){
x-=lowbit(x);
res++;
}
return res;
}
inline int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
inline int add(int a,int b){return (a+b)%mod;}
int ans,maxn;
signed main(){
cin>>num>>n>>m>>k;
for(int i=1;i<=m;i++){
cin>>a[i];
cnt[a[i]]++;
maxn=max(maxn,a[i]);
}
sort(a+1,a+1+m);
int qn=unique(a+1,a+1+m)-(a+1);
for(int i=1;i<=qn;i++)
for(int sub=(a[i]-1)&a[i];sub;sub=(sub-1)&a[i])
cnt[sub]+=cnt[a[i]];
for(int i=1;i<=maxn;i++){
if(cnt[i]){
qn=pc(i);
if(qn&1) ans=add(ans,qpow(cnt[i],k));
else ans=add(mod,ans-qpow(cnt[i],k));
}
}
cout<<ans;
return 0;
}

最新文章

  1. TreeSet
  2. Java并发和多线程(二)Executor框架
  3. 如何在iPhone与iPad上开启firebug
  4. select_tag in rails about selected not change and onchange()
  5. 【MVC 4】7.SportsSore:完成购物车
  6. [LintCode] Word Break
  7. oracle的会话(session)
  8. win7 64位下jboss配置
  9. hdoj 1856 More is better【求树的节点数】
  10. FineUI初学手册
  11. linux svn服务器普通passwd和sasl2配置
  12. leetcode 之 Permutation Sequence
  13. Unity GUI选择与评价
  14. B/S架构与C/S架构的区别
  15. 对python编程的初步理解
  16. 【转自知乎】:localhost、127.0.0.1 和 本机IP 三者的区别?
  17. Python开发之---PyCharm初体验
  18. 简单标签SimpleTag
  19. Android SDK Mangaer 需要下载的组件
  20. 源代码解析Android中View的layout布局过程

热门文章

  1. java 笔记一些
  2. Xamarin UIProgressView自定义
  3. MySql分表、分库、分片和分区的区别
  4. 3.15学习总结(Python爬取网站数据并存入数据库)
  5. Node.js躬行记(10)——接口日志查询
  6. dedecms织梦修改标题默认长度
  7. Nginx系列(6)- nginx: [error] CreateFile() &quot;D:\nginx-1.20.1/logs/nginx.pid&quot; failed (2: The system cannot find the file specified)
  8. php 设计模式 --组合器模式
  9. 51nod1675-序列变换【莫比乌斯反演】
  10. 使用 Vue 脚手架,为什么要学 webpack?