10.11NOIP模拟题(3)


/*
可以看出,对于一段区间[L,R]如果统计了答案
若a[L]<a[R],那么当右端点往左移时答案不会更优,a[R]>a[L]同理
所以两个指针分别从头尾往中间扫那边小移哪边即可。
*/
#include<bits/stdc++.h> #define N 1000007
#define ll long long using namespace std;
ll a[N];
ll n,m,ans,cnt; int main()
{
freopen("w.in","r",stdin);
freopen("w.out","w",stdout);
scanf("%lld",&n);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
int L=,R=n;
while(L<=R)
{
ll res=(R-L+)*min(a[L],a[R]);
ans=max(ans,res);
if(a[L]>=a[R]) R--;
else L++;
}
cout<<ans<<endl;
return ;
}

/*
发现算来算去所有数的二进制1的个数和位置不会变。
两个数and 或 or只是把他们的二进制位的1聚拢到一个数上。
若两个数为a,b,假设他们进行一次操作后变为(a+x),(b-x),则a>b
那么(a+x)^2+(b-x)^2=a^2+b^2+2x(x+a-b)>a^2+b^2
说明这种“聚拢”操作后平方和会变大
所以把所有数的二进制位1统计下来后尽可能的对分给一个数即可。
*/
#include<bits/stdc++.h> #define mod 998244353
#define N 10005 using namespace std;
int n,x;
int cnt[N]; int main()
{
freopen("s.in","r",stdin);
freopen("s.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&x);
for (int j=;j<;j++) if (x & (<<j)) cnt[j]++;
}
unsigned long long ans=;
for(int i=;i<n;i++)
{
x=;
for(int j=;j<;j++) if (cnt[j]) x |=(<<j),cnt[j]--;
ans+=(unsigned long long)(x)*x%mod;;
}
cout<<ans%mod;
return ;
}


#include<bits/stdc++.h> #define N 30
#define ll long long
#define mod 1000000007
#define opt 99999 using namespace std;
int n,m,k,lim;
ll ans;
int dx[]={,,,-};
int dy[]={,-,,};
int vis[N][N],f[N][N]; inline ll read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} bool can(int x,int y)
{
if(vis[x][y]==-) return false;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]>=opt) return false;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]>=opt) return false;
if(vis[x-][y-]>=opt || vis[x-][y+]>=opt) return false;
if(vis[x+][y+]>=opt || vis[x+][y-]>=opt) return false;
return true;
} void update(int x,int y)
{
vis[x][y]=opt;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]!=-)vis[x][i]++;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]!=-)vis[i][y]++;
if(x- && y- && vis[x-][y-]!=-) vis[x-][y-]++;
if(x- && y+<=m && vis[x-][y+]!=-) vis[x-][y+]++;
if(x+<=n && y- && vis[x+][y-]!=-) vis[x+][y-]++;
if(x+<=n && y+<=m && vis[x+][y+]!=-) vis[x+][y+]++;
} void _update(int x,int y)
{
vis[x][y]=;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]>)vis[x][i]--;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]>)vis[i][y]--;
if(vis[x-][y-]>)vis[x-][y-]--;
if(vis[x-][y+]>)vis[x-][y+]--;
if(vis[x+][y-]>)vis[x+][y-]--;
if(vis[x+][y+]>)vis[x+][y+]--;
f[x][y]=;
} void dfs(int x,int y,int L)
{
if(L==)
{
ans++;ans%=mod;
return;
}
for(int xx=x;xx<=n;xx++) for(int yy=;yy<=m;yy++)
{
if(f[xx][yy]) continue;
if(vis[xx][yy]<opt && can(xx,yy) && !f[xx][yy])
{
update(xx,yy);
f[xx][yy]=;
dfs(xx,yy,L-);
_update(xx,yy);//dfs(xx,yy,L);
}
}
} int main()
{
freopen("l.in","r",stdin);
freopen("l.out","w",stdout);
int x,y;ans=;
n=read();m=read();k=read();
for(int i=;i<=n;i++)
{
x=read();y=read();
vis[x][y]=-;
}
lim=n*m-k;
while(lim--)
{
memset(f,,sizeof f);
f[][]=;
dfs(,,lim);
}
ans%=mod;cout<<ans<<endl;
return ;
}
没调出来的dfs
#include <cstdio>
#include <cstring>
#include <vector> const int MAXN = ;
const int MOD = 1e9 + ; int m; inline unsigned int getBit(int i) {
return 1u << i;
} inline bool isValidLine(unsigned int s) {
return !((s & (s << )) || (s & (s << )));
} inline bool isValidTwoLines(unsigned int a, unsigned int b) {
return !((a & (b << )) || (a & (b >> )) || (a & b));
} inline bool isValidThreeLines(unsigned int a, unsigned int b, unsigned int c) {
return !(a & c) && isValidTwoLines(a, b)/* && isValidTwoLines(b, c)*/;
} int main() {
freopen("l.in", "r", stdin);
freopen("l.out", "w", stdout); int n, k;
scanf("%d %d %d", &n, &m, &k); unsigned int ban[n + ];
memset(ban, , sizeof(ban));
while (k--) {
int i, j;
scanf("%d %d", &i, &j);
ban[i] |= << (j - );
} std::vector<unsigned int> validStates; unsigned int maxS = << m;
for (int i = ; i < maxS; i++) {
if (isValidLine(i)) {
validStates.push_back(i);
}
} // f[i][state of line i - 1][state of line i] = count
long long f[n + ][validStates.size()][validStates.size()]; memset(f, , sizeof(f));
for (int a = ; a < (int)validStates.size(); a++) f[][][a] = ; long long ans = ;
for (int i = ; i <= n; i++) {
for (int c = ; c < (int)validStates.size(); c++) {
if (ban[i] & validStates[c]) continue;
for (int b = ; b < (i <= ? : (int)validStates.size()); b++) {
if (!isValidTwoLines(validStates[b], validStates[c])) continue;
if (ban[i - ] & validStates[b]) continue; for (int a = ; a < (i <= ? : (int)validStates.size()); a++) {
if (!isValidThreeLines(validStates[a], validStates[b], validStates[c])) continue;
if (a && (ban[i - ] & validStates[a])) continue; (f[i][b][c] += f[i - ][a][b]) %= MOD;
} if (i == n) (ans += f[i][b][c]) %= MOD;
}
}
} printf("%lld\n", ans);
}
std
暂时放弃 先做完互不侵犯king再来写这道题
10.11NOIP模拟题(3)的更多相关文章
- 10.11NOIP模拟题(2)
/* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...
- 9.11NOIP模拟题
NOIP模拟赛 by thmyl 题目名称 superman market Lemon_Soda 可执行文件名 superman market Lemon_Soda 输入文件 superman.i ...
- 10.13NOIP模拟题
/* 容斥原理 考虑到a[i]要么不会太大,要么就对答案贡献很小 dfs即可 */ #include<bits/stdc++.h> #define ll long long #define ...
- 10.23NOIP模拟题
叉叉题目描述现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母 a 和第二次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现的字母 a ...
- 10.9NOIP模拟题
/* big模拟 细节不少 remove表示这个玩意儿在这一秒有没有移动 注意在一秒内所有小葱一起移动,所以如果一个一个处理 别忘了“错位”这种情况 */ #include<iostream&g ...
- 10.12NOIP模拟题(2)
/* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...
- 10.12NOIP模拟题(1)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- poj 1008:Maya Calendar(模拟题,玛雅日历转换)
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64795 Accepted: 19978 D ...
- poj 1888 Crossword Answers 模拟题
Crossword Answers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 869 Accepted: 405 D ...
随机推荐
- HDU-3790最短路径问题,第十遍终于过了~
最短路径问题 Time Limit: 2000/1000 MS (J ...
- python用模块zlib压缩与解压字符串和文件的方法
摘自:http://www.jb51.net/article/100218.htm Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等. python中 ...
- 调用系统文件管理器选择图片,调用系统裁剪AIP对图片处理,显示裁剪之后的图片
package com.pingyijinren.test; import android.annotation.TargetApi; import android.app.Notification; ...
- Form表单的action和onSubmit示例介绍
action是form的属性,onSubmit为事件,要说执行的先后顺序,个人理解是onSubmit在先. 第一:action是form的属性,html5已经将其定义为必需的属性值,onSubmit为 ...
- poj 3233 Matrix Power Series 矩阵求和
http://poj.org/problem?id=3233 题解 矩阵快速幂+二分等比数列求和 AC代码 #include <stdio.h> #include <math.h&g ...
- Java 添加、更新和移除PDF超链接
简介 PDF超链接用一个简单的链接包含了大量的信息,满足了人们在不占用太多空间的情况下渲染外部信息的需求.下面将介绍通过Java 在PDF中添加.更新和移除超链接. (一)工具使用: Free Spi ...
- 技术杂记之:在阿里云centos7上部署JDK MYSQL TOMCAT
今日小编闲来无事,乘着公司新项目即将上线之际,在阿里云上整了一台centos作为测试机.原本以为一个小时搞定,结果还是花了一点小小时间.不管怎么说,记录下来,给各位小白当成课后甜点吧. 价格 先上价格 ...
- 010 ACL
Router>en Router#config t Enter configuration commands, one per line. End with CNTL/Z. Router(co ...
- C# .NET如何定义图片按钮
先添加一个按钮,然后修改Image或者BackgroundImage显然不好,我想要按钮透明,就不要放在按钮的方框里,而且鼠标滑过和鼠标点击最好都是我自定义. 我们拉一个PictureBox,然后 ...
- jQuery -> 获取指定上下文中的DOM元素
jQuery函数的第二个參数能够指定DOM元素的搜索范围. 第二个參数可分为下面类型 DOM reference jQuery wrapper document 代码演示样例 <!DOCTYPE ...