BZOJ 2595 游览计划
Codeforces开坑

HEOI2015乱做

HJWJBSR posted @ 2015年9月21日 21:31 in 题解 , 520 阅读

我已经不好意思把这个东西叫做题解了

这东西我记得之前CTSC的时候被XL叫去推HEOI,结果当时就smg都没搞出来,只弄出来Day1T3。感觉吧现在看起来还是很艹蛋

Day1T1兔子和樱花

不会做,还是看这里磨出来的代码。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 2000050
int sg[N][2],c[N],n,m,st,s[N],ans;
inline int Read()
 {
 	int x=0;char y;
 	do y=getchar(); while (y<'0'||y>'9');
 	do x=x*10+y-'0',y=getchar(); while (y>='0'&&y<='9');
 	return x;
 }
inline bool cmp(int x,int y)
 {return s[x]<s[y];}
void DFS(int x)
 {
 	for (int i=sg[x][0];i<=sg[x][1];i++)
 	  DFS(c[i]);
 	sort(c+sg[x][0],c+sg[x][1]+1,cmp);
 	s[x]+=sg[x][1]-sg[x][0]+1;
 	for (int i=sg[x][0];i<=sg[x][1];i++)
 	 if (s[x]+s[c[i]]-1<=m)
 	   s[x]+=s[c[i]]-1,ans++;else break;
 }
int main()
 {
 	n=Read();m=Read();
 	for (int i=1;i<=n;i++) s[i]=Read();
 	for (int i=1;i<=n;i++)
 	 {
 	 	int k=Read();sg[i][0]=st+1;
 	 	while (k--) c[++st]=Read()+1;
 	 	sg[i][1]=st;
 	 }
 	DFS(1);
 	cout <<ans<<endl;
 	return 0;
 }

Day1T3

当时的我都能做出来的煞笔题

#include <iostream>
#include <string.h>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int n,m,t,v;
ll mi;
inline int ans(ll x)
 {
    int i=0;
    while (x%10==0) x/=10;
    if (x%10==5) i=-1;
    while (x) x/=10,i+=2;
    return i;
 }
inline void Try(ll x)
 {
    if (x<n||x>m) return;
    int i=ans(x);
    if (v<=i||(v==i&&x>mi)) return;
    v=i;mi=x;
    return;
 }
void aa(ll x,ll y)
 {
    ll i;
    if (x>m) return;
    if (x%y==0)
      aa(x,y*10);else
     {
        if ((x%y)/(y/10)<5)
         {
            i=x-x%y;i+=y/10*5;Try(i);
         }else
         {
            i=x-x%y;i+=y/10*5+y;Try(i);
         }
        i=x;i-=x%y;i+=y;Try(i);
        aa(i,y*10);
     }
    return;
 }
int main()
 {
    int i,j,k,l,q,w,e;
    scanf("%d",&t);
    while (t--)
     {
        scanf("%d%d",&n,&m);
        mi=n;v=ans(n);
        aa(n,10);
        printf("%lld\n",mi);
     }
    return 0;
 }

Day2T2

一眼Matrix-Tree(然而当时并不知道这种东西),当然也可以用插头DP(现在都不会这种狗哔东西)

需要注意的是模数是合数,妈蛋在这里被卡了。后来突然发现算行列式并不需要真的去除而是两行相消所以是辗转相除就行了。

我真是个煞笔。

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 105
#define M 1000000000
#define ll long long
ll t[N][N],ans=1;bool b[N][N];int sg[N][N],st,n,m;char c[N];
inline void Check(int x,int y,int z,int o)
 {
 	if (!z||!o||b[z][o]) return;
 	t[sg[x][y]][sg[z][o]]=t[sg[z][o]][sg[x][y]]=M-1;
 	t[sg[x][y]][sg[x][y]]++;t[sg[z][o]][sg[z][o]]++;
 }
inline ll abs(ll x)
 {return x<0?-x:x;}
void Gauss()
 {
 	for (int i=1;i<st;i++)
 	 {
 	 	ll k=i,l;
 	 	while (k<st&&!t[k][i]) k++;
 	 	if (k==st) {ans=0;return;}
 	 	if (k!=i) swap(t[k],t[i]),ans=-ans;
 	 	for (int j=i+1;j<st;j++)
 	 	 if (t[j][i])
 	 	  {
 	 	  	 k=t[i][i];l=t[j][i];
 	 	  	 while (l)
 	 	  	  {
 	 	  	  	 ll e=k/l;
 	 	  	  	 for (int q=1;q<st;q++)
 	 	  	  	   t[i][q]=(t[i][q]-t[j][q]*e%M+M)%M;
 	 	  	  	 k%=l;swap(k,l);swap(t[i],t[j]);ans=-ans;
 	 	  	  }
 	 	  }
 	 }
 	ans+=M;
 	for (int i=1;i<st;i++)
 	  ans=ans*t[i][i]%M;
 	return;
 }
int main()
 {
 	cin >>n>>m;
 	for (int i=1;i<=n;i++)
 	 {
 	 	scanf("%s",c);
 	 	for (int j=0;j<m;j++)
 	 	 if (c[j]=='*') b[i][j+1]=1;else
 	 	   sg[i][j+1]=++st;
 	 }
 	for (int i=1;i<=n;i++)
 	 for (int j=1;j<=m;j++)
 	  if (!b[i][j])
 	  	Check(i,j,i-1,j),Check(i,j,i,j-1);
 	Gauss();
 	cout <<ans<<endl;
 	return 0;
 }

剩下题目都在后面接着的那个BZOJ乱做里面放粗来了


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter