[PYTHON] Journal de dévotion professionnel compétitif du 4e au 10e jour (du 28 juin au 4 juillet)

Je n'avais pas étudié pour faire des études supérieures, mais je ne pouvais pas le résoudre presque tous les jours. Je veux faire de mon mieux pour que les deux soient compatibles, et dès que je le résoudrai chaque jour, je me souviendrai d'écrire un article en tant que critique.

Jour 4

J'ai résolu l'ABC172-E que je ne pouvais pas passer pendant le concours. Ceci est un problème du principe d'inclusion et a été expliqué dans cet article.

Jour 5

ABC137-D Summer Vacation

Temps pris

14 minutes

Considération

C'est un problème relativement simple, donc je l'ai résolu sans trop de considération.

L'emploi à temps partiel embauché $ i $ day (ci-après abrégé en emploi à temps partiel) reçoit la récompense $ B \ _i $ après $ A \ _i $ jours, donc si vous ne travaillez pas à temps partiel avant $ MA \ _i $ jours, vous recevrez la récompense. Je ne peux pas. Par conséquent, les octets qui peuvent fonctionner et recevoir des récompenses le jour $ j $ sont les octets qui peuvent recevoir la récompense dans un délai de $ M-j $ jours. En d'autres termes, vous pouvez voir que ** il y a peu d'octets candidats qui peuvent être créés dans les derniers jours . Par conséquent, considérez dans l'ordre les octets qui peuvent être faits le $ M-1 $ jour (récompense dans un délai d'un jour), les octets qui peuvent être faits le $ M-2 $ jour (récompense dans les 2 jours), ... ** Récompense Si vous choisissez avidement parmi les octets de haut rang ** ( La base des problèmes liés aux récompenses est la méthode gourmande! **) Vous constaterez que c'est bien.

<détails>

Code Python </ summary>

abc137d.py


from heapq import *
n,m=map(int,input().split())
#Combien de jours cela prendra(1-indexed)
ab=[[] for i in range(m)]
for i in range(n):
    a,b=map(int,input().split())
    #Ne dépasse pas
    if a<=m:
        ab[a-1].append(b)
x=[]
l=0
ans=0
for i in range(m-1,-1,-1):
    for j in ab[m-1-i]:
        heappush(x,-j)
        l+=1
    if l:
        l-=1
        ans+=heappop(x)
print(-ans)

Jour 6

ABC130-E Common Subsequence

Temps pris

Je n'ai pas pu le faire pendant plus de 30 minutes, alors commentez AC

Cause d'erreur

Je n'ai pas pu résoudre l'erreur d'index et la solution de la sous-colonne commune.

Considération

Explication Bien que ce soit AC, ce n'était qu'une ** erreur dans l'index **. Python autorise les index négatifs, je veux donc prendre l'habitude de vérifier les indices.

Tout d'abord, vous pouvez avoir l'impression que cela ressemble à DP, mais les ** sous-colonnes communes ** sont très difficiles à gérer. En fait, le problème de modèle le plus typique des sous-séquences est ** LCS (Longest Common Sequence) **, et il est facile à résoudre cette fois si vous suivez une politique similaire.

Par conséquent, le tableau utilisé dans DP est ** $ dp [i] [j]: = $ (jusqu'à $ i $ ($ S_i $) dans S et $ j $ ($ T_j $) dans T). Le nombre de sous-colonnes communes pouvant être créées de jusqu'à) **. Sur cette base, afin de considérer la transition de DP, considérez comment déterminer $ dp [i + 1] [j + 1] $.

Je n'ai pas pu me faire une idée du problème de la sous-colonne commune, mais cela dépend si ** $ S_ {i + 1} $ et $ T_ {j + 1} $ sont inclus dans la sous-colonne commune ** C'est facile à comprendre si on y pense.

(1) Lorsque $ S_ {i + 1} $ et $ T_ {j + 1} $ sont inclus dans la sous-colonne commune

La fin de la sous-chaîne commune doit être ** $ S_ {i + 1} = T_ {j + 1} $ from $ S_ {i + 1} $ et $ T_ {j + 1} $ ** , $ Dp [i] [j] $ peut être considéré comme la sous-colonne commune plus $ S_ {i + 1} (= T_ {j + 1}) $.

(2) Lorsque seulement $ S_ {i + 1} $ est inclus dans la sous-colonne commune

Sous-colonnes communes de $ S_ {i + 1} $ et $ T_j $ ($ dp [i + 1] [j] $) à $ S_i $ et sous-colonnes communes de $ T_j $ ($ dp) Tout ce que vous avez à faire est d'exclure [i] [j] $).

(3) Lorsque seulement $ T_ {j + 1} $ est inclus dans la sous-colonne commune

Sous-colonnes courantes de $ S_ {i} $ et $ T_ {j + 1} $ ($ dp [i] [j + 1] $) à $ S_i $ et $ T_j $ Tout ce que vous avez à faire est d'exclure ($ dp [i] [j] $).

(4) Quand ni $ S_ {i + 1} $ ni $ T_ {j + 1} $ n'est inclus dans la sous-colonne commune

Considérons une sous-chaîne commune ($ dp [i] [j] $) qui peut aller jusqu'à $ S_ {i} $ et jusqu'à $ T_ {j + 1} $.

De ce qui précède,

dp[i+1][j+1] = \left\{
\begin{array}{ll}
dp[i][j]+(dp[i+1][j]-dp[i][j])+(dp[i][j+1]-dp[i][j])+dp[i][j]=dp[i+1][j]+dp[i][j+1](S_{i+1}=T_{j+1})\\
(dp[i+1][j]-dp[i][j])+(dp[i][j+1]-dp[i][j])+dp[i][j]=dp[i+1][j]+dp[i][j+1]-dp[i][j](S_{i+1} \neq T_{j+1})
\end{array}
\right.

Ce sera.

De plus, $ dp [i] [0], dp [0] [j] \ (i = 0 $ ~ $ N, j = 0 $ ~ $ M) $ n'a ** qu'une chaîne de caractères vide comme sous-chaîne commune * * Il peut donc être initialisé à 1.

Avec ce qui précède, vous pouvez trouver la réponse en décidant $ S_i $ et $ T_j $ dans l'ordre par une boucle bidimensionnelle. Vous devez également diviser par 10 $ ^ 9 + 7 $.

<détails>

Code Python </ summary>

abc130e.py


mod=10**9+7
n,m=map(int,input().split())
s=list(map(int,input().split()))
t=list(map(int,input().split()))
dp=[[0]*(m+1) for i in range(n+1)]
for i in range(n+1):
    dp[i][0]=1
for i in range(m+1):
    dp[0][i]=1
for i in range(n):
    for j in range(m):
        if s[i]==t[j]:
            dp[i+1][j+1]=(dp[i+1][j]+dp[i][j+1])%mod
        else:
            dp[i+1][j+1]=(dp[i+1][j]+dp[i][j+1]-dp[i][j])%mod
print(dp[n][m])

Jour 7

ABC131-E Friendships

Temps pris

Cela a pris plus de 40 minutes et je ne pouvais pas AC, alors j'ai expliqué AC

Cause d'erreur

Je ne pouvais pas trier les modèles typiques de construction de graphiques.

Considération

** Pour le moment, j'ai décidé de dessiner divers graphiques et de les rechercher de manière découvrable **, mais je ne pouvais pas facilement construire la logique. À la suite de l'expérience, lorsqu'il y a des côtés entre tous les sommets, le nombre de paires de sommets dont la distance la plus courte est 2 est 0, donc le nombre de paires de sommets dont la distance la plus courte est 2 en réduisant les côtés un par un. J'ai essayé de trouver un moyen d'augmenter un par un. Aussi, à ce moment, je ne savais pas qu'un graphe concaténé nécessiterait un minimum de $ N-1 $, mais ** je me suis perdu **.

(Ce qui suit est une considération après avoir vu l'explication, etc.)

Tout d'abord, il semble qu'il est facile de faire une politique qui ** dans un problème de construction où le cas minimum et le cas maximum sont décidés, le cas minimum et le cas maximum sont considérés et il peut être bien configuré entre eux **. En d'autres termes, s'il y a des arêtes entre tous les sommets, K sera le minimum (0), alors considérons le cas où c'est le maximum.

Ici, ** les graphes concaténés nécessitent des arêtes $ N-1 $ et la distance la plus courte entre leurs sommets est 1 **, donc $ K> \ frac {N (N-1)} {2 } - (N-1) = \ frac {(N-1) (N-2)} {2} $ Un graphe concaténé ne peut pas être construit. Par conséquent, on s'attend à ce que $ K $ soit le maximum à ** $ K = \ frac {(N-1) (N-2)} {2} $ . Ici, en considérant un graphe (en étoile) ayant une arête entre le sommet 1 et tout autre sommet, entre deux sommets autres que le sommet 1 ($ \ frac {{(N-1)} {(N) -2)}} {2} $ way) La distance la plus courte est 2 et vous pouvez construire un graphe concaténé qui satisfait $ K $ ( Shortest pour augmenter la distance entre les sommets où la distance la plus courte est 2) Il peut être plus facile de penser que ** éliminant l'espace entre les sommets avec une distance supérieure à 3).

Ensuite, ** envisagez d'augmenter les côtés un par un à partir du graphe en étoile et de diminuer les sommets avec la distance la plus courte de 2 un par un , mais en reliant les côtés entre deux sommets qui ne sont pas reliés par les côtés () Vous pouvez réduire la distance entre les sommets de un sans affecter la distance la plus courte entre les autres sommets **). En outre, la raison pour laquelle cela n'affecte pas la distance entre les deux autres sommets est que la distance la plus courte entre les deux sommets est de 1 ou 2 dans le graphique avec quelques côtés ajoutés au graphique en étoile, donc le changement de la distance la plus courte est de 2 lorsque les côtés sont ajoutés. Parce que c'est seulement 1.

A partir de ce qui précède, le graphe du sujet est construit en effectuant l'opération d'augmentation des arêtes de $ \ frac {{(N-1)} \ times {(N-2)}} {2} -k $ fois à partir de l'état du graphe en étoile. pouvez.

De plus, ** il semble préférable de se souvenir des graphiques typiques qui ont des formes distinctes lors de la création de graphiques **. Les trois suivants sont particulièrement célèbres.

IMG_0452.JPG

<détails>

Code Python </ summary>

abc131e.py


n,k=map(int,input().split())
if k>(n-1)*n//2-(n-1):
    print(-1)
else:
    ans=[(1,i) for i in range(2,n+1)]
    lestnum=(n-1)*n//2-(n-1)-k
    for i in range(2,n):
        for j in range(i+1,n+1):
            if lestnum!=0:
                ans.append((i,j))
                lestnum-=1
    print(len(ans))
    for i in ans:
        print(" ".join(map(str,i)))

8e jour

Je ne pouvais pas le faire car j'avais beaucoup de cours et c'était complet dès le matin. Je ne le ferai pas à l'avenir.

Jour 9

Je lui ai dit de ne pas le faire, mais j'ai raté le moment de le faire parce que j'étais trop précis sur les problèmes ...

Jour 10

ABC134-E Sequence Decomposing

Temps pris

Je ne pense pas que ce soit mauvais pendant environ 30 minutes.

Considération

Il est assez difficile de le prouver comme le dit la réponse, mais je pense qu'il n'est pas si difficile de le résoudre avec une politique raisonnable.

Tout d'abord, envisagez de peindre $ A \ i $ dans l'ordre à partir du plus petit $ i $, mais quand il devient $ A \ i \ geqq A \ j (i <j) $, vous ne pouvez pas peindre la même couleur. Vous devez peindre avec une nouvelle couleur. Maintenant, peignez jusqu'à $ A_i $ avec $ k $ couleur, ** pour réfléchir à la couleur à repeindre ensuite **, le nombre maximum de $ A_1 $ ~ $ A_i $ pour chaque couleur ($ \ leftrightarrow $) Enregistrez le dernier numéro) (colors). À ce stade, s'il n'y a pas de nombre inférieur à $ A {i + 1} $ dans colors, $ A {i + 1} $ est inséré dans colors comme nombre à peindre avec une nouvelle couleur. Inversement, s'il y a un nombre inférieur à $ A {i + 1} $ dans colors, réécrivez-y le plus grand nombre (supprimez ce nombre de colors puis $ A_ {i + Il est facile de voir que (insérer 1} $) est optimal ** en considérant les contre-exemples **.

De plus, pour trouver un nombre inférieur à XX, il doit être ** trié **, ** l'insertion et la suppression doivent être effectuées à grande vitesse **, et ** des éléments de même valeur peuvent exister *. Si vous considérez également *, vous pouvez voir que ** colors devrait utiliser multiset **. En outre, les nombres inférieurs à XX peuvent être reformulés à gauche des nombres supérieurs à XX (inférieur \ _bound) lorsqu'ils sont triés par ordre croissant. De plus, il faut noter qu'il est nécessaire de ** le spécifier avec un itérateur ** car il est possible de supprimer plusieurs éléments s'il est spécifié comme valeur lors de l'effacement.

<détails>

Code C ++ </ summary>

abc134e.cc


//Pour l'optimisation du compilateur
#pragma GCC optimize("O3")
//Comprendre(Ordre alphabétique)
#include<algorithm>//sort,Recherche de bisection,Tel
#include<bitset>//Jeu de bits de longueur fixe
#include<cmath>//pow,journal etc.
#include<complex>//Nombre complexe
#include<deque>//File d'attente d'accès double
#include<functional>//trier plus
#include<iomanip>//setprecision(Erreur de sortie en virgule flottante)
#include<iostream>//Entrée sortie
#include<iterator>//Régler l'opération(Ensemble de produits,Ensemble de somme,Ensemble de différences, etc.)
#include<map>//map(dictionnaire)
#include<numeric>//iota(Génération d'une chaîne entière),pgcd et lcm(c++17)
#include<queue>//queue
#include<set>//ensemble
#include<stack>//empiler
#include<string>//Chaîne
#include<unordered_map>//Carte avec itérateur mais sans ordre
#include<unordered_set>//Il y a un itérateur mais l'ordre n'est pas maintenu défini
#include<utility>//pair
#include<vector>//Tableau de longueur variable

using namespace std;
typedef long long ll;

//macro
//pour la relation de boucle
//L'argument est(Variables dans la boucle,Amplitude de mouvement)Ou(Variables dans la boucle,Premier numéro,Nombre d'extrémités)、のどちらOu
//Les variables de boucle sans D sont incrémentées de 1 et les variables de boucle avec D sont décrémentées de 1.
#define REP(i,n) for(ll i=0;i<ll(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=ll(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=ll(b);i--)
//x est un conteneur tel que vector
#define ALL(x) x.begin(),x.end() //Je souhaite omettre des arguments tels que le tri
#define SIZE(x) ll(x.size()) //taille à la taille_Changement de t à ll
//constant
#define INF 1000000000000 //10^12:Valeur extrêmement élevée,∞
#define MOD 1000000007 //10^9+7:Droit commun
#define MAXR 100000 //10^5:Portée maximale de la baie(Utilisé pour l'énumération des nombres premiers, etc.)
//Abréviation
#define PB push_back //Insérer dans le vecteur
#define MP make_pair //constructeur de paires
#define F first //Le premier élément de paire
#define S second //Le deuxième élément de paire
#define Umap unordered_map
#define Uset unordered_set

signed main(){
    ll n;cin>>n;
    vector<ll> a(n);REP(i,n)cin>>a[i];
    multiset<ll> colors;
    colors.insert(a[0]);
    FOR(i,1,n-1){
        auto ne=colors.lower_bound(a[i]);
        if(ne==colors.begin()){
            colors.insert(a[i]);
        }else{
            colors.erase(--ne);
            colors.insert(a[i]);
        }
    }
    cout<<SIZE(colors)<<endl;
}

Recommended Posts