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 ...
随机推荐
- MySQL prepare语句的SQL语法
MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name ...
- Github上600多个iOS开源项目分类及介绍
将Github上600多个iOS开源项目进行分类并且有相应介绍,小伙伴们快来看呀 地址:http://github.ibireme.com/github/list/ios/
- Mysql Replace语句的使用
Mysql Replace语句的语法: REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] VALUES ({expr ...
- 【HDOJ4812】D Tree(点分治)
题意: 给定一棵 n 个点的树,每个点有权值 Vi 问是否存在一条路径使得路径上所有点的权值乘积 mod(10^6 + 3) 为 K 输出路径的首尾标号,若有多解,输出字典序最小的解 对于100%的数 ...
- 【Tomcat】Tomcat性能分析
一.预研任务介绍和预研目标 任务介绍: Apache Tomcat是目前较为流行的web服务器,以其技术先进.性能稳定著称,其次它还是一个免费开源的项目. Tomcat性能分析的意义在于能为日常工作中 ...
- Thinkphp5.0 的使用模型Model查询
Thinkphp5.0 的使用模型Model查询 一.查询多条记录 获取多个数据可以使用:select()方法和all()方法. 示例一:使用all()方法. //(1)筛选条件使用闭包函数 $res ...
- Thinkphp5.0 视图view取值
Thinkphp5.0 视图view取值 <!-- 获取控制器传递的变量 --> <li>{$age}</li> <!-- 获取服务器的信息 --> & ...
- hdu - 1195 Open the Lock (bfs) && hdu 1973 Prime Path (bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个 ...
- JSP页面不支持EL表达式的解决方法
JSP页面不支持EL表达式的问题就出在新建项目时web.xml的声明上. web.xml声明部分一般分为如下版本的xsd: web-app_2_2.xsd web-app_2_3.xsd web-ap ...
- Analyzing Storage Performance using the Windows Performance Analysis ToolKit (WPT)
https://blogs.technet.microsoft.com/robertsmith/2012/02/07/analyzing-storage-performance-using-the-w ...