TJOI2015 day1解题报告
博客园的编辑器真的是太蛋疼了= =,想用tex然后上jpg又贴不了链接,真的很纠结啊= =
描述:戳上面吧= =
首先这道题我觉得是这套题最漂亮的一道题了(虽然说学校的题库里居然有一道和这个一模一样的= =)
首先我们可以先把那个式子转化为其中b[i]是表示矩阵a中第i行为0或为1,然后就有两种方法转化为网络流啦
方法一:可以用最大权闭合子图的方法来考虑,将c[i]以及a[i][j]的选择与否视为事件的话,可以发现是一个点数为n*n的最大权闭合子图,就可以愉快的用网络流来搞辣
方法二:我们可以看做一个二元关系,因为可以看做i的选取会花费 c[i],而同时选择i, j则会获得一定的收益,那么我们可以得到一个二元关系(但还是需要经过一定的转化的),然后点数就只有n啦
我只写了方法一,虽说点数很多,但边数少,还是很快的
还有一种水法,貌似直接把所有a相加然后减去b就行辣(数据就是这么水= =)
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 300000
#define maxm 900000
struct edges{
int to,next,cap;
}edge[maxm*];
int next[maxn],l;
inline void addedge(int x,int y,int z) {
l++;
edge[l*]=(edges){y,next[x],z};next[x]=l*;
edge[l*+]=(edges){x,next[y],};next[y]=l*+;
}
#define inf 0x7fffffff
int s,t,h[maxn],p[maxn],gap[maxn];
int sap(int u,int flow) {
if (u==t) return flow;
int cnt=;
for (int i=p[u];i;i=edge[i].next)
if (edge[i].cap&&h[u]==h[edge[i].to]+) {
int cur=sap(edge[i].to,min(flow-cnt,edge[i].cap));
edge[i].cap-=cur;edge[i^].cap+=cur;
p[u]=i;
if ((cnt+=cur)==flow) return cnt;
}
if (!(--gap[h[u]])) h[s]=t;
gap[++h[u]]++;
p[u]=next[u];
return cnt;
}
inline int maxflow(){
for (int i=;i<=t;i++) p[i]=next[i];
memset(gap,,sizeof(gap));
memset(h,,sizeof(h));
gap[]=t;
int flow=;
while (h[s]<t) flow+=sap(s,inf);
return flow;
}
int id[][],cnt,n;
int main(){
freopen("algebra.in","r",stdin);
freopen("algebra.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) id[i][j]=++cnt;
s=++cnt,t=++cnt;
int sum=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
int x;
scanf("%d",&x);
addedge(s,id[i][j],x);
sum+=x;
}
for (int i=;i<=n;i++) {
int x;
scanf("%d",&x);
addedge(id[][i],t,x);
}
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
addedge(id[i][j],id[][i],inf);
addedge(id[i][j],id[][j],inf);
}
printf("%d\n",sum-maxflow());
return ;
}
这是道结论题= =
某个啥啥定理说:DAG的最小链覆盖=最大独立点集,可见网格图的最大独立点集一定是从右上到左下的一条路径,那么我们就可以直接dp搞了
CODE:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1100
int f[maxn][maxn],a[maxn][maxn],T,n,m;
int main(){
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
scanf("%d",&T);
while (T--) {
memset(f,,sizeof(f));
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%d",a[i]+j);
int ans=;
for (int i=n;i;i--)
for (int j=;j<=m;j++) {
f[i][j]=max(f[i][j-],max(f[i+][j-]+a[i][j],f[i+][j]));
ans=max(ans,f[i][j]);
}
printf("%d\n",ans);
}
return ;
}
T3:[TJOI2015]弦论
这道题嘛= =,50分算法是深圳市选题,然后100分的话我们可以用SAM来解决这个问题
首先我们先来考虑一下50分的算法,SAM上的每一个节点都表示该图中的一个子串,所以我们可以类似dp求出答案
而对于T=1的时候,可以发现重复的字串其实都在以parents树上该节点为根的子树
所以我们还是可以dp一下求出来
八中上被卡常数了,老调不出来
CODE:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1001000
char s[maxn];
typedef long long ll;
struct sam{
sam *pre,*ch[];
int val,cnt;ll size;
bool b;
}_t[maxn];
sam *root,*last;
int t,cnt;
inline void add(int x) {
sam *p=last;
_t[++cnt].val=last->val+;
sam *np=_t+cnt;
while (p&&p->ch[x]==) p->ch[x]=np,p=p->pre;
if (p==) np->pre=root;
else {
sam* q=p->ch[x];
if (p->val+==q->val) np->pre=q;
else {
_t[++cnt].val=p->val+;
sam*nq=_t+cnt;
memcpy(nq->ch,q->ch,sizeof(q->ch));
nq->pre=q->pre;
np->pre=q->pre=nq;
while (p&&p->ch[x]==q) p->ch[x]=nq,p=p->pre;
}
}
last=np;
}
inline void bfs(){
static sam* q[maxn];
q[]=root;
sam* u=q[];
int l,r;
for (l=r=;l<=r;u=q[++l]) {
for (int i=;i<;i++) {
if (!u->ch[i]||u->ch[i]->b) continue;
u->ch[i]->b=;
q[++r]=u->ch[i];
}
}
u=q[r];
for (int i=r;i;u=q[--i]) {
if (!t) u->cnt=;
if (i==) u->cnt=;
if (u->pre) u->pre->cnt+=u->cnt;
}
}
char ans[maxn];
int l;
void dfs(sam *p){
int i;
p->b=;
p->size=p->cnt;
for(i=;i<;i++)
if(p->ch[i]){
if(p->ch[i]->b==) dfs(p->ch[i]);
p->size+=p->ch[i]->size;
}
}
int k;
void get(sam *p){
int i;
if(k<=p->cnt) return ;
k-=p->cnt;
for(i=;i<;i++)
if(p->ch[i]){
if(k<=p->ch[i]->size){
ans[++l]=i+'a';
get(p->ch[i]);
return ;
}
k-=p->ch[i]->size;
}
}
int main(){
scanf("%s%d%d",&s,&t,&k);
root=_t;
root->val=;last=root;
int n=strlen(s);
for (int i=;i<n;i++) {
add(s[i]-'a');
last->cnt=;
}
bfs();
dfs(root);
if (root->size<k) {
printf("-1\n");
return ;
}
get(root);
printf("%s\n",ans+);
return ;
}
TJOI2015 day1解题报告的更多相关文章
- 学大伟业Day1解题报告
学大伟业Day1解题报告 张炳琪 一. 时间分配 T1:30分钟 T2: 60分钟 T3:100分钟 二.答题情况及错因 T1:100 T2:55 T3 ...
- 常州培训 day1 解题报告
第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...
- TJOI2015 day2解题报告
TJOI2015终于写完啦~~~ T1:[TJOI2015]旅游 描述:(BZ没题面只能口述了..)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然 ...
- 洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...
- NOIP2018提高组Day1 解题报告
前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...
- NOIP 2017 Day1 解题报告
总分:100分 T1,小凯的疑惑, 100分 T2,时间复杂度,0分 T3,逛公园,0分 T1 ###题意简化: 给定两个互质的数字,输出最大不能表示的数: 基础数论题目 代码: #include&l ...
- CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告
最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...
- 【洛谷】NOIP2018原创模拟赛DAY1解题报告
点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...
- 2017.7.15清北夏令营精英班Day1解题报告
成绩: 预计分数:20+10+40 实际分数:100+10+40. 一百三十多人的比赛全场rand7还水了个鼠标+键盘 unbelievable! 考试题目链接: https://www.luogu. ...
随机推荐
- 试水mongodb er
1)data ready var a = {"name":"zhekou","CharDate":"2015-12-01" ...
- PHP7新特性
重写ZenVM,性能比PHP5.6提升300% 新特性: 1.变量类型(为PHP7.1的JIT特性做准备)function test(int $a, string $b, array $c) : in ...
- java学习(四) excel读取
private static void readExcel() { String filePath = "C:/Standardzid.xls"; File file = new ...
- Sqlserver 时间字段批量增加
update dt_article_attribute_value set end_time = dateadd(mi,30,start_time) create table tb(dt dateti ...
- sqlserver 设置外键
CREATE TABLE Orders ( O_Id int NOT NULL, OrderNo int NOT NULL, Id_P int, PRIMARY KEY (O_Id), FOREIGN ...
- 解析xml的问题未解决
工作上需要解析xml,目前的逻辑是:解析xml到对象中,然后对象再插入数据库.但这存在内存溢出的风险. 今天做的另外一件事是将循环用到工作上,暂时还没有测试,是否能保证程序的重启.有待观察 ##### ...
- javascript 备忘录
JS语法 javascript 对象: var cars=new Array("Audi","BMW","Volvo"); 声明变量类型 当 ...
- Mysql中各种常见数据库存储引擎对比
- js模块化开发——前端模块化
在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到了客 户端(表单验证等),随着web2.0时代的到来,Ajax技术 ...
- 用Linux命令行获取本机外网IP地址
引言:目前获取ip的方法中,ifconfig和ip获取函数得到的都是内网ip.有时候需要获取外网ip,目前通用的做法,是向外部服务器发送请求,解析外部服务器响应,从而得到的自己的外网ip.linux下 ...