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. ...
随机推荐
- Delphi 内存分配 StrAlloc New(转)
源:Delphi 内存分配 StrAlloc New 引自:http://anony3721.blog.163.com/blog/static/5119742010824934164/ 给字符指针 ...
- UVa 908 - Re-connecting Computer Sites
题目大意:有n个网站,由m条线路相连,每条线路都有一定的花费,找出连接所有线路的最小花费. 最小生成树问题(Minimal Spanning Tree, MST),使用Kruskal算法解决. #in ...
- UVa 11503 - Virtual Friends
题目大意:给出若干对朋友关系,每给出一对朋友关系,就输出二者所在关系网中的人数. 首先是对每个人编号,使用map简化编号过程,然后就是使用并查集更新集合.要注意的是当给出A和B的朋友关系时,无论A和B ...
- 如何编写高质量CSS
虽然写过很多css代码,但每次动手写都让我痛苦不堪,如何组织好那一堆堆的代码,如何提高代码复用率,甚至如何命名类,这些都让我纠结.下面的浅显的谈一谈在看了<编写高质量代码>中的html和c ...
- VirtualBox中安装Android-x86详解
1.下载安装VirtualBox 官网:http://www.virtualbox.org/wiki/Downloads 2.下载Android-x86 官网:http://www.android-x ...
- 导航栏项目滑过时子菜单显示/隐藏jquery代码
;(function(window){ $('.menuitem').hover(function(){ $('>a',this).css('background-color ...
- 3. 托管对象模型的迁移(Core Data 应用程序实践指南)
本章介绍如何添加模型版本及模型映射,演示几种迁移技术,供在升级模型时使用. 3.1. 修改托管对象模型 3.2. 添加模型版本 3.3. 轻量级迁移方式 3.4. 默认的迁移方式 3.5. 通过迁移管 ...
- Delphi中String类型原理介绍
Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...
- noip2016天天爱跑步
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...
- 如何在windows xp下实现声音内录
问题描述: 用屏幕录制软件录制一个视频,能够成功录制视频,但无法录制视频里面的声音. 问题原因: 因为现在的多数声卡,均无法直接通过声卡自身的功能实现内录和立体声混音. 这是由于声卡芯片厂商迫于RIA ...